package com.crowntit.infrastructure.adapter.repository;

import com.crowntit.domain.tag.adapter.repository.ITagRepository;
import com.crowntit.domain.tag.model.entity.CrowdTagsJobEntity;
import com.crowntit.infrastructure.dao.ICrowdTagsDao;
import com.crowntit.infrastructure.dao.ICrowdTagsDetailDao;
import com.crowntit.infrastructure.dao.ICrowdTagsJobDao;
import com.crowntit.infrastructure.dao.po.CrowdTags;
import com.crowntit.infrastructure.dao.po.CrowdTagsDetail;
import com.crowntit.infrastructure.dao.po.CrowdTagsJob;
import com.crowntit.infrastructure.redis.IRedisService;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RBitSet;
import org.springframework.stereotype.Repository;

import javax.annotation.Resource;

@Slf4j
@Repository
public class TagRepository implements ITagRepository {

    @Resource
    private ICrowdTagsJobDao crowdTagsJobDao;
    @Resource
    private ICrowdTagsDetailDao crowdTagsDetailDao;
    @Resource
    private ICrowdTagsDao crowdTagsDao;

    @Resource
    private IRedisService redisService;

    @Override
    public CrowdTagsJobEntity queryCrowdTagsJobByTagIdBatchId(String tagId, String batchId) {
        CrowdTagsJob crowdTagsJobReq = CrowdTagsJob.builder()
                .batchId(batchId)
                .tagId(tagId)
                .build();

        CrowdTagsJob crowdTagsJob = crowdTagsJobDao.queryCrowdTagsJobByTagIdBatchId(crowdTagsJobReq);
        CrowdTagsJobEntity crowdTagsJobEntity = CrowdTagsJobEntity.builder()
                .batchId(crowdTagsJob.getBatchId())
                .tagId(crowdTagsJob.getTagId())
                .tagType(crowdTagsJob.getTagType())
                .tagRule(crowdTagsJob.getTagRule())
                .statEndTime(crowdTagsJob.getStatEndTime())
                .statStartTime(crowdTagsJob.getStatStartTime())
                .status(crowdTagsJob.getStatus())
                .build();
        return crowdTagsJobEntity;
    }

    @Override
    public boolean addCrowdTagsDetail(String userId, String tagId) {
        // 避免重复写入
        CrowdTagsDetail crowdTagsDetailReq = CrowdTagsDetail.builder()
                .tagId(tagId)
                .userId(userId)
                .build();
        CrowdTagsDetail queriedCrowdTagsDetail = crowdTagsDetailDao.queryCrowdTagsDetail(crowdTagsDetailReq);
        int index = redisService.getIndexFromUserId(userId);
        RBitSet bitSet = redisService.getBitSet(tagId);

        if (queriedCrowdTagsDetail == null){
            crowdTagsDetailDao.addCrowdTagsDetail(crowdTagsDetailReq);
            bitSet.set(index, true);
            return true;
        }

        //如果是重复写，这里会有个重置过期时间的问题
        bitSet.set(index, true);
        return false;
    }

    @Override
    public void updateCrowdTagsStatistics(String tagId, int cnt) {
        Integer statistics = crowdTagsDao.queryStatisticsByTagId(tagId);
        CrowdTags crowdTagsReq = CrowdTags.builder()
                .tagId(tagId)
                .statistics(Integer.toString(statistics + cnt))
                .build();
        crowdTagsDao.updateStatistics(crowdTagsReq);
    }
}
